package cn.itcast.delay.task;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * @author 虎哥
 */
public class DelayTask<D> implements Delayed {
    /**
     * 任务包含的数据，可以是订单id
     */
    private D data;

    /**
     * 结束时间， System.currentTimeMillis + 延迟时间
     */
    private long deadLine;

    public DelayTask(D data, long deadLine) {
        this.data = data;
        this.deadLine = deadLine;
    }

    /**
     * 剩余有效期，到期后就应该可以被获取和执行
     *
     * @param unit 时间单位
     * @return 剩余多少毫秒
     */
    @Override
    public long getDelay(TimeUnit unit) {
        // 把毫秒值，转为指定的时间单位 unit
        return unit.convert(deadLine - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    /**
     * 延迟任务的排序方法，拿当前任务与指定的任务排序
     *
     * @param o 要比较的任务
     * @return int值，小于 0 代表 当前任务小于指定任务，大于0 代表 当前任务大于指定任务， 等于0，代表相等
     */
    @Override
    public int compareTo(Delayed o) {
        long result = this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
        if (result == 0) {
            return 0;
        }
        return result > 0 ? 1 : -1;
    }

    public D getData() {
        return data;
    }

    public void setData(D data) {
        this.data = data;
    }

    public long getDeadLine() {
        return deadLine;
    }

    public void setDeadLine(long deadLine) {
        this.deadLine = deadLine;
    }
}
